package com.skyd.andengine;

import java.util.ArrayList;

import org.anddev.andengine.audio.music.MusicFactory;
import org.anddev.andengine.audio.sound.SoundFactory;
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.IResolutionPolicy;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.shape.IShape;
import org.anddev.andengine.entity.sprite.BaseSprite;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.ui.activity.LayoutGameActivity;
import org.anddev.andengine.opengl.font.Font;
import org.anddev.andengine.opengl.font.FontFactory;
import org.anddev.andengine.opengl.font.StrokeFont;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;

import com.skyd.core.common.Direction;

import android.graphics.Rect;
import android.graphics.RectF;

public abstract class GameActivity extends LayoutGameActivity {

	/**
	 * 创建摄像机
	 * @return
	 */
	public Camera creatCamera(){
		return new Camera(0, 0, getCameraWidth(), getCameraHeight());
	}

	/**
	 * 在onLoadScene()函数后执行，此时全部加载完毕
	 */
	@Override
	public void onLoadComplete() {

	}

	/**
	 * 最先执行的函数，用于加载引擎
	 */
	@Override
	public Engine onLoadEngine() {
		return new  Engine(creatEngineOptions());
	}


	/**
	 * 在onLoadEngine()函数后执行，用于加载资源
	 */
	@Override
	public void onLoadResources() {
		setBasePath();
		LoadResources();
	}

	/**
	 * 在onLoadResources()函数后执行，用于加载场景
	 */
	@Override
	public Scene onLoadScene() {
		final Scene scene = LoadScene();		
		return scene;
	}

	/**
	 * 获取摄像机取景宽度
	 * 
	 * @return
	 */
	public abstract int getCameraWidth();

	/**
	 * 获取摄像机取景高度
	 * 
	 * @return
	 */
	public abstract int getCameraHeight();
	
	/**
	 * 获取屏幕方向
	 * @return
	 */
	public abstract ScreenOrientation getScreenOrientation();
	
	/**
	 * 获取多分辨率适配方案
	 * @return
	 */
	public abstract IResolutionPolicy getResolutionPolicy();
	

	/**
	 * 创建引擎选项
	 * @return
	 */
	public EngineOptions creatEngineOptions() {
		EngineOptions op = new EngineOptions(true,getScreenOrientation(),getResolutionPolicy(),creatCamera());
		op.setNeedsMusic(true);
		op.setNeedsSound(true);
		return op;
	}
	
	/**
	 * 加载资源
	 */
	public abstract void LoadResources();
	
	/**
	 * 加载场景
	 * @param scene 场景
	 */
	public abstract Scene LoadScene();
	
	/**
	 * 加载纹理到BitmapTextureAtlas
	 * @param a 纹理图集
	 */
	public void loadTexture(BitmapTextureAtlas a){
		getEngine().getTextureManager().loadTexture(a);
	}
	
	/**
	 * 在图集上创建位图纹理区域（仅为注册用，需要对图集调用loadTexture方法后才有效）
	 * @param a 纹理图集
	 * @param filename 文件名
	 * @param texturePositionX 纹理区域起始坐标X
	 * @param texturePositionY 纹理区域起始坐标Y
	 * @return 纹理区域
	 */
	public TextureRegion createBitmapTexture(BitmapTextureAtlas a,String filename,int texturePositionX,int texturePositionY){
		return BitmapTextureAtlasTextureRegionFactory.createFromAsset(a,this,filename,texturePositionX,texturePositionY);
	}
	
	/**
	 * 读取位图纹理
	 * @param width 宽度，必须是2的n次幂
	 * @param height 高度，必须是2的n次幂
	 * @param options 绘图选项
	 * @param filename 文件名
	 * @return 纹理区域
	 */
	public TextureRegion loadBitmapTexture(int width,int height,TextureOptions options,String filename){
		BitmapTextureAtlas t = new BitmapTextureAtlas(width,height,options);
		TextureRegion tr = createBitmapTexture(t,filename,0,0);
		loadTexture(t);
		return tr;
	}
	
	/**
	 * 读取位图纹理，采用TextureOptions.BILINEAR选项
	 * @param width 宽度，必须是2的n次幂
	 * @param height 高度，必须是2的n次幂
	 * @param filename 文件名
	 * @return 纹理区域
	 */
	public TextureRegion loadBitmapTexture(int width,int height,String filename){
		return loadBitmapTexture(width,height,TextureOptions.BILINEAR,filename);
	}
	
	/**
	 * 在图集上创建位平铺图纹理区域（仅为注册用，需要对图集调用loadTexture方法后才有效）
	 * @param a 纹理图集
	 * @param filename 文件名
	 * @param texturePositionX 纹理区域起始坐标X
	 * @param texturePositionY 纹理区域起始坐标Y
	 * @return 纹理区域
	 */
	public TiledTextureRegion createBitmapTiledTexture(BitmapTextureAtlas a,String filename,int texturePositionX,int texturePositionY,int columns,int rows){
		return BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(a,this,filename,texturePositionX,texturePositionY, columns, rows);
	}
	
	/**
	 * 读取平铺位图纹理
	 * @param width 宽度，必须是2的n次幂
	 * @param height 高度，必须是2的n次幂
	 * @param options 绘图选项
	 * @param filename 文件名
	 * @return 纹理区域
	 */
	public TiledTextureRegion loadBitmapTiledTexture(int width,int height,TextureOptions options,String filename,int columns,int rows){
		BitmapTextureAtlas t = new BitmapTextureAtlas(width,height,options);
		TiledTextureRegion tr = createBitmapTiledTexture(t, filename,0,0, columns, rows);
		loadTexture(t);
		return tr;
	}
	
	/**
	 * 读取平铺位图纹理，采用TextureOptions.BILINEAR选项
	 * @param width 宽度，必须是2的n次幂
	 * @param height 高度，必须是2的n次幂
	 * @param filename 文件名
	 * @return 纹理区域
	 */
	public TiledTextureRegion loadBitmapTiledTexture(int width,int height,String filename,int columns,int rows){
		return loadBitmapTiledTexture(width,height,TextureOptions.BILINEAR,filename, columns, rows);
	}
	
	/**
	 * 读取字体
	 * @param size 大小
	 * @param color 颜色
	 * @param options 绘图选项
	 * @param filename 文件名
	 * @return 字体
	 */
	public Font loadFont(int size,int color,TextureOptions options,String filename){
		BitmapTextureAtlas t = new BitmapTextureAtlas(256,256,options);
		Font f = FontFactory.createFromAsset(t, this, filename, size, true, color);
		getEngine().getTextureManager().loadTexture(t);
		getEngine().getFontManager().loadFont(f);
		return f;
	}
	
	/**
	 * 读取描边字体
	 * @param size 大小
	 * @param color 颜色
	 * @param options 绘图选项
	 * @param filename 文件名
	 * @param strokewidth 描边宽度
	 * @param strokeclolor 描边颜色
	 * @return 字体
	 */
	public StrokeFont loadStrokeFont(int size,int color,TextureOptions options,String filename,int strokewidth,int strokeclolor){
		BitmapTextureAtlas t = new BitmapTextureAtlas(256,256,options);
		StrokeFont f = FontFactory.createStrokeFromAsset(t, this, filename, size, true, color,strokewidth,strokeclolor);
		getEngine().getTextureManager().loadTexture(t);
		getEngine().getFontManager().loadFont(f);
		return f;
	}
	
	/**
	 * 设置所有资源的基础路径，在LoadResources()之前执行，可重载实现自定义目录路径
	 */
	public void setBasePath(){
		setTextureBasePath();
		FontFactory.setAssetBasePath("fonts/");
		MusicFactory.setAssetBasePath("music/");
		SoundFactory.setAssetBasePath("sound/");
	}

	/**
	 * 设置纹理资源的基础路径，在LoadResources()之前执行，可重载实现自定义目录路径，或根据设备尺寸切换不同分辨率的整套纹理
	 */
	public void setTextureBasePath() {
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("textures/");
	}
	
	/**
	 * 按顺序分页分布排列形状
	 * @param sprites 形状列表
	 * @param area 分布区域
	 * @param columns 列数
	 * @param rows 行数
	 * @param horizontal 是否横向排列页面
	 * @param direction 对齐方位枚举，可以组合使用
	 */
	public void distributionArrangeShapes(ArrayList<IShape> shapes,RectF area,int columns,int rows,boolean horizontal,Direction direction){
//		int PageContainUp = columns*rows;
//		float ColumnsWidth=area.width()/columns;
//		float RowsHeight=area.height()/rows;
		for(int i=0;i<shapes.size();i++){
//			float PageNum= i/PageContainUp;
//			float PageBaseX =(horizontal?PageNum *getCameraWidth():0)+area.left;
//			float PageBaseY=(horizontal?0:PageNum*getCameraHeight())+area.top;
////			GameShape.setPositionCenter(shapes.get(i),PageBaseX+(i%columns)*ColumnsWidth+ColumnsWidth/2,PageBaseY+(i/columns%rows)*RowsHeight+RowsHeight/2);
////			shapes.get(i).setPosition(PageBaseX+(i%columns)*ColumnsWidth+ColumnsWidth/2-shapes.get(i).getWidth()/2,PageBaseY+(i/columns%rows)*RowsHeight+RowsHeight/2-shapes.get(i).getHeight()/2);
//			GameShape.setPosition(shapes.get(i),PageBaseX+(i%columns)*ColumnsWidth+ColumnsWidth/2,PageBaseY+(i/columns%rows)*RowsHeight+RowsHeight/2,direction);
			distributionArrangeShape(shapes.get(i), i, area, columns, rows, horizontal, direction);
		}
	}
	
	/**
	 * 按顺序分页分布排列形状
	 * @param sprite 形状
	 * @param index 以0起始的次序位置
	 * @param area 分布区域
	 * @param columns 列数
	 * @param rows 行数
	 * @param horizontal 是否横向排列页面
	 * @param direction 对齐方位枚举，可以组合使用
	 */
	public void distributionArrangeShape(IShape shape,int index,RectF area,int columns,int rows,boolean horizontal,Direction direction){
		int PageContainUp = columns*rows;
		float ColumnsWidth=area.width()/columns;
		float RowsHeight=area.height()/rows;
		float PageNum= index/PageContainUp;
		float PageBaseX =(horizontal?PageNum *getCameraWidth():0)+area.left;
		float PageBaseY=(horizontal?0:PageNum*getCameraHeight())+area.top;
//		GameShape.setPositionCenter(shape,PageBaseX+(index%columns)*ColumnsWidth+ColumnsWidth/2,PageBaseY+(index/columns%rows)*RowsHeight+RowsHeight/2);
//		shape.setPosition(PageBaseX+(index%columns)*ColumnsWidth+ColumnsWidth/2-shape.getWidth()/2,PageBaseY+(index/columns%rows)*RowsHeight+RowsHeight/2-shape.getHeight()/2);
		GameShape.setPosition(shape,PageBaseX+(index%columns)*ColumnsWidth+ColumnsWidth/2,PageBaseY+(index/columns%rows)*RowsHeight+RowsHeight/2,direction);
	}
}
